/*
 * @Author: WuFeng <763467339@qq.com>
 * @Date: 2024-10-23 11:17:24
 * @LastEditTime: 2024-11-01 17:24:06
 * @LastEditors: WuFeng <763467339@qq.com>
 * @Description: Tauri2多窗口封装管理
 * @FilePath: \markdown-magic\src\utils\windows\index.js
 * @Copyright 版权声明
 */

import { getAllWindows, getCurrentWindow } from '@tauri-apps/api/window'
import { WebviewWindow, getAllWebviewWindows, getCurrentWebviewWindow} from '@tauri-apps/api/webviewWindow'
import { relaunch, exit } from '@tauri-apps/plugin-process'
import { emit, listen } from '@tauri-apps/api/event'
import { message as messageAnt } from 'ant-design-vue'

// import { setWin } from './actions'

const appWindow = getCurrentWindow()

/**
 * 创建窗口参数配置
 * https://v2.tauri.app/reference/javascript/api/namespacewindow/#windowoptions
 */
export const windowConfig = {
    label: null,            // 窗口唯一label
    title: '',              // 窗口标题
    url: '',                // 路由地址url
    width: 1000,            // 窗口宽度
    height: 640,            // 窗口高度
    minWidth: null,         // 窗口最小宽度
    minHeight: null,        // 窗口最小高度
    x: null,                // 窗口相对于屏幕左侧坐标
    y: null,                // 窗口相对于屏幕顶端坐标
    center: true,           // 窗口居中显示
    resizable: true,        // 是否支持缩放
    maximized: false,       // 最大化窗口
    decorations: false,     // 窗口是否装饰边框及导航条
    alwaysOnTop: false,     // 置顶窗口
    dragDropEnabled: false, // 禁止系统拖放
    visible: true,          // 隐藏窗口
    closable: true,         // 是否启用窗口的原生关闭按钮。默认为true。

    // ...
}

class Windows {
    constructor() {
        // 主窗口
        this.mainWin = null
    }

    // 创建新窗口
    async createWin(options) {
        console.log('-=-=-=-=-=开始创建窗口')

        const args = Object.assign({}, windowConfig, options)

        // 判断窗口是否存在
        const existWin = await this.getWin(args.label)
        if(existWin) {
            console.log('窗口已存在>>', existWin)
            return
            // ...
        }
        // 创建窗口对象
        const win = new WebviewWindow(args.label, args)
        console.log(`🚀 ~ Windows ~ createWin ~ win:`, win)

        // 窗口创建完毕/失败
        win.once('tauri://created', async() => {
            console.log('tauri://created')
            // 是否主窗口
            if(args.label.indexOf('main') > -1) {
                // ...
            }

            // 是否最大化
            if(args.maximized && args.resizable) {
                console.log('is-maximized')
                await win.maximize()
            }
        })

        win.once('tauri://error', async(error) => {
            console.log('window create error!', error)
            // const { payload } = error
            // if (payload.indexOf('already exists') > -1) {
            //   messageAnt.warning('窗口已存在')
            // }
        })
    }

    // 获取窗口
    async getWin(label) {
        return await WebviewWindow.getByLabel(label)
    }

    // 获取全部窗口
    async getAllWin() {
        //  return getAll()
        return await getAllWindows()
    }

    // 开启主进程监听事件
    async listen() {
        console.log('——+——+——+——+——+开始监听窗口')

        // 创建新窗体
        await listen('win-create', (event) => {
            console.log('------------------------------win-create', event)
            this.createWin(event.payload)
        })

        // 显示窗体
        await listen('win-show', async(event) => {
          console.log('--------------------------------win-show', event)
          console.log(`🚀 ~ Windows ~ awaitlisten ~ appWindow:`, appWindow)
            if(appWindow.label.indexOf('main') == -1) return
            await appWindow.show()
            await appWindow.unminimize()
            await appWindow.setFocus()
        })

        // 隐藏窗体
        await listen('win-hide', async(event) => {
          console.log('--------------------------------win-hide', event)
            if(appWindow.label.indexOf('main') == -1) return
            await appWindow.hide()
        })

        // 关闭窗体
        await listen('win-close', async(event) => {
          console.log('--------------------------------win-close', event)
            await appWindow.close()
        })

        // ...
    }
}

export default Windows